from typing import List
from cachetools import TTLCache
from dto.strategy_assessment import RiskAssessment
from dto.strategy_info import StrategyInfoMetadata
from service.strategy.base_strategy import BaseStrategy
from common.enum.strategy_group_enum import StrategyGroup
from common.enum.strategy_type_enum import StrategyType
from dto.strategy_calculate_result import StrategyCalculateResult


class RiskLevelAnalysisStrategy(BaseStrategy):
    """
    通过缓存获取指定股票的 StrategyCalculateResult，并基于风险等级分析得分。
    """

    # 初始化缓存工具，缓存 30 分钟，最大缓存 100 个结果
    cache = TTLCache(maxsize=100, ttl=1800)

    def analyze(self, stock_code: str) -> RiskAssessment:
        """
        分析当前股票的风险等级并返回评分。
        :param stock_code: 股票代码
        :return: 风险评估结果
        """
        # 默认分数和描述
        node_point = 0
        description = "无法获取股票的风险等级数据。"

        # 从缓存中获取相关的 StrategyCalculateResult
        strategy_result = self.get_strategy_result(stock_code)
        if strategy_result:
            # 使用风险等级除以 2 作为评分
            risk_level = strategy_result.risk_level
            node_point = risk_level / 2
            description = (
                f"股票 {stock_code} 的风险等级为 {risk_level}，得分为 {node_point}。"
            )

        # 返回风险评估结果
        return RiskAssessment(
            stock_code=stock_code,
            description=description,
            config=self.strategyConfig(),
            node_point=node_point,
        )

    def get_strategy_result(self, stock_code: str) -> StrategyCalculateResult:
        """
        从缓存中获取或加载指定股票的 StrategyCalculateResult。
        :param stock_code: 股票代码
        :return: StrategyCalculateResult 对象
        """
        if stock_code in self.cache:
            return self.cache[stock_code]

        # 模拟从外部数据源获取结果（需要根据实际需求实现）
        strategy_result = self.fetch_from_data_source(stock_code)
        if strategy_result:
            # 缓存结果
            self.cache[stock_code] = strategy_result
        return strategy_result

    def fetch_from_data_source(self, stock_code: str) -> StrategyCalculateResult:
        """
        模拟从数据源获取 StrategyCalculateResult。
        实际实现应从数据库或服务获取数据。
        :param stock_code: 股票代码
        :return: StrategyCalculateResult 对象
        """
        # 这里可以实现从数据库、API 或其他服务获取数据的逻辑
        # 示例返回一个伪造的结果
        return StrategyCalculateResult(
            stock_info=None,  # 假设股票信息需要补充
            risk_assessments=[],
            latest_price=100.0,
            total_score=50,
            risk_level=6,  # 示例风险等级
            focus_level=4,
        )

    def strategyConfig(self) -> StrategyInfoMetadata:
        """
        返回策略的配置信息。
        """
        return StrategyInfoMetadata(
            strategy_code="risk_level_analysis",
            strategy_name="风险等级分析策略",
            strategy_group=StrategyGroup.RISK,
            strategy_type=StrategyType.NEWS,
            analysis_day=1,
            strategy_level=1,
        )
